home *** CD-ROM | disk | FTP | other *** search
/ Atari Mega Archive 1 / Atari Mega Archive - Volume 1.iso / telecomm / sticpsrc.lzh / SOURCE.ARC / RCMD.C < prev    next >
C/C++ Source or Header  |  1990-08-25  |  6KB  |  240 lines

  1. /* remote command server */
  2.  
  3. #include <stdio.h>
  4. #include "global.h"
  5. #include "mbuf.h"
  6. #include "netuser.h"
  7. #include "timer.h"
  8. #include "tcp.h"
  9. #include "password.h"
  10. #include "rcmd.h"
  11. #include "cmdparse.h"
  12.  
  13. static struct tcb *rcmd_tcb;        /* SERVER prototype tcb */
  14. static char *rcmd_paswrd = NULLCHAR;    /* password for rcmd */
  15.  
  16. static struct mbuf *rcmdbuf = NULLBUF;    /* output buffer for rcmdputc */
  17. static struct mbuf *rcmdout = NULLBUF;    /* chain of rcmd output bufs */
  18.  
  19. static void rcmd_recv(),rcmd_state();
  20. static int rcmdputc();
  21.  
  22. extern char version[];            /* program version */
  23. extern char hostname[];            /* hostname to use in prompt */
  24. extern char prompt[];            /* the net> prompt */
  25. extern char nospace[];            /* "no space" message */
  26. extern struct cmds cmds[];        /* commands */
  27.  
  28. /* Start up rcmd server */
  29. rcmd1(argc,argv)
  30. int argc;
  31. char *argv[];
  32. {
  33.     struct socket lsocket;
  34.     char tos = 0;
  35.  
  36.     if (rcmd_paswrd != NULLCHAR){
  37.         free(rcmd_paswrd);
  38.         rcmd_paswrd = NULLCHAR;
  39.     }
  40.  
  41.     if (argc > 2){
  42.         if ((rcmd_paswrd = malloc(strlen(argv[2]) + 1)) == NULLCHAR) {
  43.             printf(nospace);
  44.             return 1;
  45.         }
  46.         strcpy(rcmd_paswrd,argv[2]);
  47.     }
  48.  
  49.     lsocket.address = ip_addr;
  50.     if(argc < 2)
  51.         lsocket.port = RCMD_PORT;
  52.     else {
  53.         if ((lsocket.port = atoi(argv[1])) == 0)
  54.             lsocket.port = RCMD_PORT;
  55.     }
  56.     if(argc > 3)
  57.         tos = get_tos(argv[3]);
  58.     rcmd_tcb = open_tcp(&lsocket,NULLSOCK,TCP_SERVER,0,rcmd_recv,NULLVFP,rcmd_state,tos,(char *)NULL);
  59.     return 0;
  60. }
  61.  
  62. /* Shut down rcmd server */
  63. rcmd0()
  64. {
  65.     if(rcmd_tcb != NULLTCB)
  66.         close_tcp(rcmd_tcb);
  67.  
  68.     if (rcmd_paswrd != NULLCHAR){
  69.         free(rcmd_paswrd);
  70.         rcmd_paswrd = NULLCHAR;
  71.     }
  72.     return 0;
  73. }
  74.  
  75. /* rcmd server receiver upcall */
  76. static
  77. void
  78. rcmd_recv(tcb,cnt)
  79. struct tcb *tcb;
  80. int16 cnt;
  81. {
  82.     struct rcmd *rcmd;
  83.     struct mbuf *bp;
  84. #ifdef MWC
  85.     int (*save_pt)();
  86. #else
  87. # if (defined(MSDOS) && !defined(MSC) && !defined(__TURBOC__))
  88.     extern int (*put_stdout)();
  89. # else
  90.     int c, save_handle;
  91. #  ifdef MSC
  92.     char *tmpfilename;
  93. #  else
  94.     char tmpfilename[L_tmpnam];
  95. #  endif
  96. # endif
  97. #endif
  98.     char cmdline[RCMD_LINE];
  99.  
  100.     rcmd = (struct rcmd *) tcb->user;    /* get control block */
  101.  
  102.     if(recv_tcp(tcb,&bp,cnt) > 0){
  103.         append(&rcmd->input,bp);        /* append received bytes */
  104.         tcp_output(tcb);            /* ack the received data */
  105.  
  106.         fflush(stdout);            /* make sure stdout is flushed */
  107.  
  108. #ifdef MWC
  109.         save_pt = stdout->_pt;        /* save current stdout putc */
  110.         stdout->_pt = rcmdputc;        /* set stdout putc routine */
  111. #else
  112. # if (defined(MSDOS) && !defined(MSC) && !defined(__TURBOC__))
  113.         put_stdout = rcmdputc;        /* set stdout putc routine */
  114. # else
  115.         /* a portable way is to open a file on (ram) disk */
  116.  
  117.         save_handle = dup(fileno(stdout));    /* save stdout */
  118. #  ifdef MSC
  119.         tmpfilename = tempnam(NULL,"rcmd");
  120. #  else
  121.         tmpnam(tmpfilename);
  122. #  endif
  123.         freopen(tmpfilename,"w+b",stdout);
  124. # endif
  125. #endif
  126.  
  127.         while((bp = pullline(&rcmd->input,0)) != NULLBUF){
  128.         cmdline[pullup(&bp,cmdline,sizeof(cmdline) - 1)] = '\0';
  129.         free_p(bp);
  130.         if (rcmd->pass.okay) {
  131.             cmdparse(cmds,cmdline);
  132.             printf("%s %s",hostname,prompt);
  133.         } else {
  134.             if (ok_password(&rcmd->pass,cmdline)) {
  135.             log_tcp(tcb,"open rcmd %d",tcb->conn.local.port);
  136.             printf("%s %s",hostname,prompt);
  137.             } else {
  138.             log_tcp(tcb,"fail rcmd %d",tcb->conn.local.port);
  139.             printf("sorry\n");
  140.             }
  141.         }
  142.         }
  143.  
  144. #ifdef MWC
  145.         stdout->_pt = save_pt;
  146. #else
  147. # if (defined(MSDOS) && !defined(MSC) && !defined(__TURBOC__))
  148.         put_stdout = (int (*)()) 0; /* go back to default stdout */
  149. # else
  150.         fseek(stdout,0L,0);
  151.         while((c = getc(stdout)) != EOF)
  152.         rcmdputc(c);        /* copy tmpfile in rcmdbuffer */
  153.  
  154.         fseek(stdout,0L,0);        /* don't write to disk */
  155.         fflush(stdout);
  156.         dup2(save_handle,fileno(stdout));
  157.         unlink(tmpfilename);    /* remove file */
  158.         close(save_handle);
  159. # endif
  160. #endif
  161.  
  162.         append(&rcmdout,rcmdbuf);
  163.         send_tcp(tcb,rcmdout);
  164.         rcmdout = rcmdbuf = NULLBUF;
  165.     }
  166.  
  167.     if (!rcmd->pass.okay)
  168.         close_tcp(tcb);
  169. }
  170.  
  171. /* character output routine for use in rcmd server */
  172. static
  173. int
  174. rcmdputc (c,outfile)
  175. int c;
  176. FILE *outfile;
  177. {
  178.     if (c == '\n')
  179.     rcmdputc('\r',outfile);
  180.  
  181.     if (rcmdbuf == NULLBUF &&
  182.     (rcmdbuf = alloc_mbuf(RCMD_OBUF)) == NULLBUF)
  183.     return EOF;
  184.  
  185.     rcmdbuf->data[rcmdbuf->cnt++] = c;
  186.  
  187.     if (rcmdbuf->cnt >= rcmdbuf->size){
  188.     append(&rcmdout,rcmdbuf);
  189.     rcmdbuf = NULLBUF;
  190.     }
  191.  
  192.     return (c);
  193. }
  194.  
  195. /* Log connection state changes; also respond to remote closes */
  196. static
  197. void
  198. rcmd_state(tcb,old,new)
  199. register struct tcb *tcb;
  200. char old,new;
  201. {
  202.     char buf[256];
  203.     struct rcmd *rcmd;
  204.  
  205.     switch(new){
  206.     case ESTABLISHED:
  207.         if((rcmd = (struct rcmd *) calloc(1,sizeof(struct rcmd))) == NULLRCMD){
  208.             /* No space, kill connection */
  209.             close_tcp(tcb);
  210.             return;
  211.         }
  212.         rcmd->conn = tcb;        /* Downward link */
  213.         tcb->user = (char *)rcmd;    /* Upward link */
  214.  
  215.         if ((rcmd->pass.paswrd = rcmd_paswrd) == NULLCHAR){
  216.             log_tcp(tcb,"open rcmd %d (no pw)",tcb->conn.local.port);
  217.             rcmd->pass.okay = 1;
  218.             sprintf(buf,"rcmd %s\r\n%s %s",version,hostname,prompt);
  219.         } else {
  220.             sprintf(buf,"rcmd %s %s\r\n%s\r\n",version,hostname,
  221.                     gen_challenge(&rcmd->pass));
  222.         }
  223.         send_tcp(tcb,qstring(buf));
  224.         break;
  225.     case CLOSE_WAIT:
  226.         close_tcp(tcb);
  227.         break;
  228.     case CLOSED:
  229.         if(tcb != rcmd_tcb)
  230.             log_tcp(tcb,"close rcmd %d",tcb->conn.local.port);
  231.         if (tcb->user != NULLCHAR)
  232.             free(tcb->user);
  233.         del_tcp(tcb);
  234.         /* Clean up if server is being shut down */
  235.         if(tcb == rcmd_tcb)
  236.             rcmd_tcb = NULLTCB;
  237.         break;
  238.     }
  239. }
  240.